#include <stdio.h>
#include "cmd.h"
#include "validate.h"
#include "store.h"

#define MAX_CMD_SIZE    256

CMD ltv_cmd_list[MAX_CMD_SIZE] = {
        // get
        {GET_NET_SHELF_ID,       (void (*)(LTV)) validate_get_net_shelf_id,       (void (*)(LTV)) get_net_shelf_id},
        {GET_NET_SHELF_INFO,     (void (*)(LTV)) validate_get_net_shelf_info,     (void (*)(LTV)) get_net_shelf_info},

        // set
        {SET_NET_SHELF_TEMPLATE, (void (*)(LTV)) validate_set_net_shelf_template, (void (*)(
                LTV)) set_net_shelf_template},
        {SET_NET_SHELF_CONTENT,  (void (*)(LTV)) validate_set_net_shelf_content,  (void (*)(
                LTV)) set_net_shelf_content},
        {SET_NET_SHELF_LED,      (void (*)(LTV)) validate_set_net_shelf_led,      (void (*)(LTV)) set_net_shelf_led},

};

//执行命令
void execute_cmd(LTV ltv) {
    for (int i = 0; i < MAX_CMD_SIZE && ltv_cmd_list[i].cmd != 0; i++) {
        if (ltv_cmd_list[i].cmd == ltv.type) {
            //验证数据正确性
            if (VALIDATE_OK == ((void *(*)(LTV ltv)) (ltv_cmd_list[i].validate))(ltv)) {
                ((void *(*)(LTV ltv)) (ltv_cmd_list[i].function))(ltv);
            }
            break;
        }
    }
}

int get_net_shelf_id(LTV ltv) {
    LOG("get_net_shelf_id\n");
    return 0;
}

int get_net_shelf_info(LTV ltv) {
    LOG("get_net_shelf_info\n");
    return 0;
}


//ToDo 在设置的时候需要对模板进行管理
int set_net_shelf_template(LTV ltv) {
    //打开

    store_param(ltv,STORE_TYPE_TEMPLATE);
    LOG("set_net_shelf_template\n");
    return 0;
}

int set_net_shelf_content(LTV ltv) {

    LTV template_ltv = load_param(STORE_TYPE_TEMPLATE_CONTENT);
    store_param(template_ltv,STORE_TYPE_TEMPLATE_CONTENT);
    show_ltv(ltv);
    //获取模板如果模板内容已经存在则更新否则则存储
    //对比解析一边解析一边同传入的content ltv进行对比
    //除开NET_SHELF_PARAM 以外的命令都是可以直接解析的
    //参数类型在模板的时候需要拿出参数已经指定的属性如文字大小颜色等等


    LOG("set_net_shelf_content\n");
    return 0;
}

int set_net_shelf_led(LTV ltv) {
    LOG("set_net_shelf_led\n");
    return 0;
}

void parse_cmd_from_buff(unsigned char *data_buff, int buff_size) {
    LTV ltv = {0,0,0};
    unsigned char *p = data_buff;
    int counter=0;
    //解析多段值
    do{
        ltv = ltv_decode(p);
        execute_cmd(ltv);
        p+=ltv.length;
        counter+=ltv.length;
    } while (ltv.length>0&&counter<buff_size);

}


//ToDo 保存文字 保存在特殊的区域
int set_net_shelf_font(LTV ltv) {
    LOG("set_net_shelf_char\n");

    /*
     * 保存形式
     * L：数据长度
     * T:已经存的字节数
     * V：
     *   L:数据长度
     *   T：字符编码
     *   V：字形
     */
    //打开已经存储的字形库
    //储存新的字形

    return 0;
}

LTV load_net_shelf_char(unsigned short int char_code) {
    LTV ltv;
    return ltv;
}


